﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Gustozzi.DAL;
using Gustozzi.BL;

namespace WebGustozzi.ModuloVentas
{
    ///<summary>
    ///Nombre	    : wfGenerarPedidoVenta
    ///Descripción	: 
    ///               
    ///</summary>
    ///<remarks>
    ///Fecha        Moficado Por        Descripción
    ///12/02/2012               	    Versión inicial
    ///20/02/2012   Marco Pizarro	    Agregar validaciones iniciales
    ///</remarks>
    public partial class WebForm1 : System.Web.UI.Page
    {
        VentasDataEntities contexto = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Inicializar();
                hdf_InicioGrilla.Value = "S";
            }
            else
            {
                hdf_InicioGrilla.Value = "N";
                CargarLista();
            }
        }

        public void Inicializar()
        {
            this.txtFechaEmision.Attributes.Add("onblur", String.Format("FechaValida('{0}','{1}','{2}')", txtFechaEmision.ClientID, "Documento Tributario", "Ingrese una Fecha de Emisión válido"));
            this.txtFechaVencimiento.Attributes.Add("onblur", String.Format("FechaValida('{0}','{1}','{2}')", txtFechaVencimiento.ClientID, "Documento Tributario", "Ingrese una Fecha de Vencimiento válido"));

            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            var tipoDocumento = from c in contexto.TiposDocumentoTributario
                                select new
                                {
                                    Codigo = c.codigoTipoDocTrib,
                                    Nombre = c.descripcion
                                };
            ddlTipDocTributario.DataSource = tipoDocumento;
            ddlTipDocTributario.DataTextField = "Nombre";
            ddlTipDocTributario.DataValueField = "Codigo";
            ddlTipDocTributario.DataBind();


            var estados = from c in contexto.Estados
                          select new
                          {
                              Codigo = c.codigoEstado,
                              Nombre = c.nombre
                          };
            ddlEstado.DataSource = estados;
            ddlEstado.DataTextField = "Nombre";
            ddlEstado.DataValueField = "Codigo";
            ddlEstado.DataBind();
            
            var vendedores = from c in contexto.Vendedores.Include("Empleado")
                             select new 
                             {
                                 Codigo=c.codigoVendedor,
                                 Nombre = c.Empleado.apellidoPaterno + " " + c.Empleado.apellidoMaterno + " " + c.Empleado.nombre
                             };
            ddlVendedor.DataSource = vendedores;
            ddlVendedor.DataTextField = "Nombre";
            ddlVendedor.DataValueField = "Codigo";
            ddlVendedor.DataBind();

            txtMontoImpuestos.Text = 0.ToString() ;
            txtMontoNeto.Text = 0.ToString();
            txtMontoTotal.Text = 0.ToString();

            EditarControles(false);
        }

        public void EditarControles(Boolean estado)
        {
            ddlTipDocTributario.Enabled = estado;
            txtNumeroSerie.Enabled = estado;
            txtCorrelativo.Enabled = estado;
            txtFechaEmision.Enabled = estado;
            txtCodCliente.Enabled = estado;
            txtNombreCliente.Enabled = estado;
            txtDireccion.Enabled = estado;
            txtFechaVencimiento.Enabled = estado;
            imbAgregarProducto.Enabled = estado;
            imbAgregarPedido.Enabled = estado;
            imbBuscarCliente.Visible = estado;
            imbBuscarDireccion.Visible = estado;
            imbBuscarDocTributario.Visible = !estado;
            imbFechaEmision.Visible = estado;
            imbFechaVencimiento.Visible = estado;
            ddlVendedor.Enabled = estado;
        }

        protected void imbCerrar_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("../wfPrincipal.aspx");
        }


        protected void txtCodigoCliente_TextChanged(object sender, EventArgs e)
        {
            try
            {
                BuscarCliente();
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }
        public void BuscarCliente()
        {
            if (contexto == null)
            {
                contexto = new VentasDataEntities();
            }
            txtNombreCliente.Text = string.Empty;
            if (!txtCodCliente.Text.Trim().Equals(string.Empty))
            {
                int idCliente = Convert.ToInt32(txtCodCliente.Text.Trim());
                var lstClientes = from c in contexto.Clientes
                                  where c.codigoCliente == idCliente
                                  select c;

                if (lstClientes.Count() > 0)
                {
                    Cliente oCliente = lstClientes.First();
                    txtNombreCliente.Text = oCliente.apellidoPaternoCliente + " " + oCliente.apellidoMaternoCliente + ", " + oCliente.nombreCliente;
                }

            }
        }
        protected void imbNuevo_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                if (contexto == null)
                {
                    contexto = new VentasDataEntities();
                }
                var oDocumento = from c in contexto.DocumentosTributario
                                 select c.codigoDocTrib;

                int idDocumento = 1;
                if (oDocumento.Count() > 0)
                {
                    idDocumento = oDocumento.Max();
                    idDocumento += 1;
                }

                LimpiarCampos();
                EditarControles(true);
                divControlesManten.Visible = false;
                divRegistrar.Visible = true;
                ddlEstado.SelectedValue = "1";

                hdfIdDoc.Value = idDocumento.ToString();
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }
        public void LimpiarCampos()
        {
            divMensaje.Visible = false;
            txtNumeroSerie.Text = string.Empty;
            txtCorrelativo.Text = string.Empty;
            txtFechaEmision.Text = string.Empty;
            ddlEstado.SelectedIndex = 0;
            ddlTipDocTributario.SelectedIndex = 0;
            txtDireccion.Text = string.Empty;
            txtFechaVencimiento.Text = string.Empty;
            grvListaProductos.DataSource = null;
            txtMontoNeto.Text = string.Empty;
            txtMontoImpuestos.Text = string.Empty;
            txtMontoTotal.Text = string.Empty;
            Session["listaProductos"] = null;
            txtCodCliente.Text = string.Empty;
            txtNombreCliente.Text = string.Empty;
            txtNroPedido.Text = string.Empty;
            hdfIdDoc.Value  = string.Empty;
            hdfIdPedido.Value = string.Empty;
            hdfNumItems.Value = string.Empty;
            ddlVendedor.SelectedIndex = 0;
            grvListaProductos.DataSource = null;
            grvListaProductos.DataBind();
        }

        protected void hdfNumItems_ValueChanged(object sender, EventArgs e)
        {
            CargarLista();
        }

        protected void grvListaProductos_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (hdf_InicioGrilla.Value == "N")
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    e.Row.Attributes["OnClick"] = Page.ClientScript.GetPostBackClientHyperlink(this.grvListaProductos, "Select$" + e.Row.RowIndex.ToString());
                }
            }
        }

        protected void hdfIdPedido_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                if (!hdfIdPedido.Value.Equals(string.Empty))
                {
                    AgregarPedido();
                }
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }
        public void CargarLista() 
        {
            List<ItemPedido> listadoPedido = null;
            if (Session["listaProductos"] == null)
            {
                listadoPedido = new List<ItemPedido>();
            }
            else
            {
                listadoPedido = (List<ItemPedido>)Session["listaProductos"];
            }
            grvListaProductos.DataSource = listadoPedido;
            grvListaProductos.DataBind();

            double montoAntesImp = 0;
            double montoImp = 0;
            double montoDespuesImp = 0;

            double impuesto = 0;

            if (contexto == null) 
            {
                contexto = new VentasDataEntities();
            }

            var listaImpuesto = from igv in contexto.ListadoIGV
                                where igv.estado==1
                                select igv.porcentaje;

            if(listaImpuesto.Count()>0)
            {
                impuesto=Convert.ToDouble(listaImpuesto.First())/100;
            }

            foreach (var item in listadoPedido)
            {
                montoDespuesImp += item.importe;
            }
            montoAntesImp = Math.Round (montoDespuesImp / (1 + impuesto),2);
            montoImp = montoDespuesImp - montoAntesImp;
            txtMontoNeto.Text = montoAntesImp.ToString();
            txtMontoImpuestos.Text = montoImp.ToString();
            txtMontoTotal.Text = montoDespuesImp.ToString();

        }
        public void AgregarPedido() 
        {

            if (contexto == null) 
            {
                contexto = new VentasDataEntities();
            }

            int idPedido=Convert.ToInt32(hdfIdPedido.Value);

            var listaPedido = from p in contexto.Pedidos
                                where p.codigoPedido==idPedido 
                                select p;
            if (listaPedido.Count() > 0) 
            {
                Pedido oPedido = listaPedido.First();
                txtCodCliente.Text= oPedido.codigoCliente.ToString();
                txtDireccion.Text = oPedido.datosDespacho;
                BuscarCliente();
            }

            var itemsPedido = from p in contexto.PedidoItems
                              where p.codigoPedido==idPedido
                              select p;

            List<ItemPedido> listadoPedido = null;
            if (Session["listaProductos"] == null)
            {
                listadoPedido = new List<ItemPedido>();
            }
            else
            {
                listadoPedido = (List<ItemPedido>)Session["listaProductos"];
            }

            if (itemsPedido !=null) 
            {
                foreach (var item in itemsPedido)
                {
                    
                    ItemPedido oPedidoItem = new ItemPedido();
                    oPedidoItem.cantidad = (Double)item.cantidad;
                    if (item.codigoProducto.HasValue)//Producto
                    {
                        oPedidoItem.codigoProducto = (int)item.codigoProducto;

                        var listaProductos = from p in contexto.Productos.Include("UnidadMedida") 
                                             where p.codigoProducto==oPedidoItem.codigoProducto
                                             select new {
                                                 Nombre = p.descripcion,
                                                 UnidadMedida =p.UnidadMedida.descripcion
                                             };
                        if(listaProductos.Count()>0)
                        {
                            oPedidoItem.nombreProducto = listaProductos.First().Nombre;
                            oPedidoItem.unidadMedida = listaProductos.First().UnidadMedida;
                        }
                    }
                    else if(item.codigoPromocion.HasValue)
                    {
                        int codigoPromocion = (int)item.codigoPromocion;
                        oPedidoItem.codigoPromocion = codigoPromocion;
                             var listaPromocion = from p in contexto.Promociones 
                                             where p.codigoPromocion ==oPedidoItem.codigoPromocion
                                             select p.descripcion ;
                         if(listaPromocion.Count()>0)
                        {
                           oPedidoItem.nombreProducto =  listaPromocion.First();
                           oPedidoItem.unidadMedida = "UND";
                        }

                    }
                    oPedidoItem.precioUnitario = (double)item.precioUnitario;
                    oPedidoItem.importe = (double)item.importe;

                    int numItems = listadoPedido.Count;

                    if (numItems==0)
                    {
                        numItems++;
                        Session["numItems"] = numItems;
                    }
                    else
                    {
                        numItems = Convert.ToInt32(Session["numItems"]);
                        numItems++;
                        Session["numItems"] = numItems;
                    }

                    hdfNumItems.Value = numItems.ToString();
                    oPedidoItem.codigoPedido = 1;
                    oPedidoItem.codigoPedidoDetalle = numItems;

                    listadoPedido.Add(oPedidoItem);
          
                }
            }
           
             Session["listaProductos"] = listadoPedido;
             CargarLista();
        
        }

        protected void imbGuardar_Click(object sender, ImageClickEventArgs e)
        {
            divMensaje.Visible = false;
            try
            {
                Guardar();
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        public void Guardar() 
        {
            if (ddlTipDocTributario.SelectedIndex <= 0)
            {
                throw new Exception("Seleccione tipo de documento.");
            }

            if (ddlEstado.SelectedIndex <= 0)
            {
                throw new Exception("Seleccione Estado.");
            }

            if (txtNumeroSerie.Text.Equals(string.Empty))
            {
                throw new Exception("Ingrese Numero de Serie.");
            }

            if (txtCorrelativo.Text.Equals(string.Empty))
            {
                throw new Exception("Ingrese Numero Correlativo de Comprobante de Pago.");
            }

            if (txtFechaEmision.Text.Equals(string.Empty))
            {
                throw new Exception("Ingrese Fecha de Emision.");
            }

            if (ddlVendedor.SelectedIndex <= 0)
            {
                throw new Exception("Seleccione vendedor.");
            }

            if (txtCodCliente.Text.Equals(String.Empty))
            {
                throw new Exception("Seleccione el cliente.");
            }

            if (this.txtDireccion.Text.Equals(String.Empty))
            {
                throw new Exception("Seleccione la dirección de facturación.");
            }

            if (this.txtFechaVencimiento.Text.Equals(String.Empty))
            {
                throw new Exception("Seleccione la fecha de vencimiento.");
            }

            if (this.grvListaProductos.Rows.Count == 0)
            {
                throw new Exception("Ingrese por lo menos 1 producto.");  
            }

            if (contexto == null) 
            {
                contexto = new VentasDataEntities();
            }
            int idDoc = 0;
            if(!hdfIdDoc.Value.Equals (string.Empty))
            {
                idDoc = Convert.ToInt32(hdfIdDoc.Value);
            }
            var listadoDocs = from p in contexto.DocumentosTributario
                              where p.codigoDocTrib==idDoc 
                              select p;

            DocumentoTributario oDocumentoTributario = null;

            if (listadoDocs.Count() > 0)
            {
                oDocumentoTributario = listadoDocs.First();
            }
            else 
            {
                oDocumentoTributario = new DocumentoTributario();
                contexto.AddToDocumentosTributario(oDocumentoTributario);
            }

            if(!hdfIdPedido.Value.Equals(String.Empty))
            {
                if(!hdfIdPedido.Value.Equals("0"))
                {
                    int idPedido=Convert.ToInt32( hdfIdPedido.Value) ;
                    oDocumentoTributario.codigoPedido = idPedido;
                }
            }
           
            oDocumentoTributario.codigoTipoDocTrib = Convert.ToInt32(ddlTipDocTributario.SelectedValue);
            oDocumentoTributario.estado = ddlEstado.SelectedValue;
            oDocumentoTributario.fechaEmision = Convert.ToDateTime(txtFechaEmision.Text);
            oDocumentoTributario.montoIGV = Convert.ToDouble(txtMontoImpuestos.Text);
            oDocumentoTributario.montoNeto = Convert.ToDouble(txtMontoNeto.Text);
            oDocumentoTributario.montoTotal = Convert.ToDouble(txtMontoTotal.Text);
            oDocumentoTributario.numeroDocTrib = txtNumeroSerie.Text;
            oDocumentoTributario.correlativoDocTrib = txtCorrelativo.Text;
            oDocumentoTributario.datosDespacho = txtDireccion.Text;
            oDocumentoTributario.codigoVendedor = Convert.ToInt32(ddlVendedor.SelectedValue);
            DocumentoTributarioBL oDocBL = new DocumentoTributarioBL();

            List<ItemPedido> listadoPedido = null;
            if (Session["listaProductos"] == null)
            {
                listadoPedido = new List<ItemPedido>();
            }
            else
            {
                listadoPedido = (List<ItemPedido>)Session["listaProductos"];
            }

           int rpt= oDocBL.ActualizarDocumentoTributario(oDocumentoTributario, listadoPedido, contexto);
           if (rpt > 0)
           {
               lblMsj.Text = "Se guardo satisfactoriamente el documento.";
               lblMsj.ForeColor = System.Drawing.Color.Blue;
               EditarControles(false);
               divControlesManten.Visible = true;
               divRegistrar.Visible = false;
               divMensaje.Visible = true;
           }
           else
           {
               lblMsj.Text = "Se produjo un error al intentar guardar, cierre y vuelva a intentarlo.";
               lblMsj.ForeColor = System.Drawing.Color.Red;
               divMensaje.Visible = true;
           }
        }

       
        protected void imbAnular_Click(object sender, ImageClickEventArgs e)
        {
            divMensaje.Visible = false;
            try
            {
                if (hdfIdDoc.Value.Equals(string.Empty))
                {
                    throw new Exception("No ha seleccionado un documento a anular");
                }
                DocumentoTributarioBL oDocBL = new DocumentoTributarioBL();

                int idDocumento = Convert.ToInt32(hdfIdDoc.Value);
                int rpt = oDocBL.AnularDocumentoTributario(idDocumento);
                if (rpt > 0)
                {
                    lblMsj.Text = "Se anulo satisfactoriamente el documento.";
                    lblMsj.ForeColor = System.Drawing.Color.Blue;
                    LimpiarCampos();
                }
                else
                {
                    lblMsj.Text = "Se produjo un error al intentar anular, cierre y vuelva a intentarlo.";
                    lblMsj.ForeColor = System.Drawing.Color.Red;
                    divMensaje.Visible = true;
                }
            }
            catch (Exception ex)
            {
                lblMsj.Text = ex.Message;
                lblMsj.ForeColor = System.Drawing.Color.Red;
                divMensaje.Visible = true;
            }
        }

        protected void imbCancelar_Click(object sender, ImageClickEventArgs e)
        {
            LimpiarCampos();
            EditarControles(false);
            divRegistrar.Visible = false;
            divControlesManten.Visible = true;
        }

        protected void hdfIdDoc_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                BuscarDocTributario();
            }
            catch (Exception)
            {
                
                throw;
            }
        }
        public void BuscarDocTributario()
        {
            if (!hdfIdDoc.Value.Equals(string.Empty))
            {
                int idDocTrib = Convert.ToInt32(hdfIdDoc.Value);
                LimpiarCampos();
                if (contexto == null) 
                {
                    contexto = new VentasDataEntities();
                }
                var listadoDocs = from p in contexto.DocumentosTributario.Include("DocumentoTributarioDetalle")
                                  where p.codigoDocTrib == idDocTrib
                                  select p;
                if (listadoDocs.Count() > 0)
                {
                    DocumentoTributario oDocumento = listadoDocs.First();
                    txtCodCliente.Text = oDocumento.codigoCliente.ToString();
                    txtDireccion.Text = oDocumento.datosDespacho;
                    BuscarCliente();
                    ddlTipDocTributario.SelectedValue = oDocumento.codigoTipoDocTrib.ToString();
                    txtNumeroSerie.Text = oDocumento.numeroDocTrib;
                    txtCorrelativo.Text = oDocumento.correlativoDocTrib;
                    txtFechaEmision.Text = oDocumento.fechaEmision.ToShortDateString();
                    ddlEstado.SelectedValue = oDocumento.estado;
                    txtMontoNeto.Text = oDocumento.montoNeto.ToString();
                    txtMontoImpuestos.Text = oDocumento.montoIGV.ToString();
                    txtMontoTotal.Text = oDocumento.montoTotal.ToString();
                    ddlVendedor.SelectedValue = oDocumento.codigoVendedor.ToString();
                    List<ItemPedido> listadoPedido = new List<ItemPedido>();

                    foreach (var item in oDocumento.DocumentoTributarioDetalle)
                    {
                        ItemPedido oItemPedido = new ItemPedido();
                        oItemPedido.cantidad = (double)item.cantidad;
                        oItemPedido.codigoPedido = item.codigoDocTrib;
                        oItemPedido.codigoPedidoDetalle = item.codigoDocTribDet;
                        oItemPedido.codigoProducto = item.codigoProducto;
                        oItemPedido.importe = (double)item.importe;
                        oItemPedido.precioUnitario = (double)item.precioUnitario;
                        var listaProducto = from p in contexto.Productos.Include("UnidadMedida")
                                            where p.codigoProducto == oItemPedido.codigoProducto
                                            select p;
                        if (listaProducto.Count() > 0)
                        {
                            oItemPedido.nombreProducto = listaProducto.First().nombre;
                            oItemPedido.unidadMedida = listaProducto.First().UnidadMedida.descripcion;
                        }
                        listadoPedido.Add(oItemPedido);
                    }
                    Session["listaProductos"] = listadoPedido;
                    CargarLista();
                }
            }
            else 
            {
                LimpiarCampos();
            }
        }

        protected void imbImprimir_Click(object sender, ImageClickEventArgs e)
        {
            lblMsj.Text = "En construncción...";
            lblMsj.ForeColor = System.Drawing.Color.Green;
            divMensaje.Visible = true;
        }
    }
}